#pragma once
#include<spdlog/spdlog.h>
#include<spdlog/sinks/stdout_color_sinks.h>
#include<spdlog/sinks/basic_file_sink.h>
#include<spdlog/async.h>
#include<iostream>
namespace wsll{
//mode:true 发布模式-将日志输出到文件里 false 调试模式-将日志输出到控制台
//
std::shared_ptr<spdlog::logger> g_default_logger;
void init_logger(bool mode,const std::string& file, int32_t level)
{
    //如果是调试模式，则创建标准输出日志器，输出等级为最低
    if(mode==false)
    {
        g_default_logger = spdlog::stdout_color_mt("default-logger");//同步的就好
        g_default_logger->set_level(spdlog::level::level_enum::trace);//trace以上的等级都会被打印下来
        g_default_logger->flush_on(spdlog::level::level_enum::trace);//当日志等级为trace时立刻刷新

    }
    //如果是发布模式，则创建文件输出日志器，输出等级依据参数决定
    else
    {
        g_default_logger = spdlog::basic_logger_mt("default-logger", file);
        g_default_logger->set_level(static_cast<spdlog::level::level_enum>(level));//trace以上的等级都会被打印下来
        g_default_logger->flush_on(static_cast<spdlog::level::level_enum>(level));//当日志等级为trace时立刻刷新
    }
    g_default_logger->set_pattern("[%n][%H:%M:%S][%t][%-8l]%v");
}

#define LOG_TRACE(format, ... )wsll::g_default_logger->trace(std::string("[{}:{}] ")+format,__FILE__,__LINE__,##__VA_ARGS__)//如果没有参数，##__VA_ARGS__会被忽略，这就是##的作用
#define LOG_DEBUG(format, ... )wsll::g_default_logger->debug(std::string("[{}:{}] ")+format,__FILE__,__LINE__,##__VA_ARGS__)//如果没有##，则当没有参数时，会报错
#define LOG_INFO(format, ... )wsll::g_default_logger->info(std::string("[{}:{}] ")+format,__FILE__,__LINE__,##__VA_ARGS__)
#define LOG_WARN(format, ... )wsll::g_default_logger->warn(std::string("[{}:{}] ")+format,__FILE__,__LINE__,##__VA_ARGS__)
#define LOG_ERROR(format, ... )wsll::g_default_logger->error(std::string("[{}:{}] ")+format,__FILE__,__LINE__,##__VA_ARGS__)
#define LOG_FATAL(format, ... )wsll::g_default_logger->critical(std::string("[{}:{}] ")+format,__FILE__,__LINE__,##__VA_ARGS__)
}
